home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / windows / wdj1096.zip / TOMLINSN.ZIP / WDJSRVC.C < prev   
C/C++ Source or Header  |  1996-07-21  |  3KB  |  106 lines

  1. // wdjsrvc.c
  2.  
  3. #include <windows.h>
  4.  
  5. HANDLE  hDoneEvent = NULL, hThread = NULL;
  6. DWORD   dwCurrentState;
  7. SERVICE_STATUS_HANDLE  hService;
  8.  
  9. BOOL StartedAsService(LPSERVICE_TABLE_ENTRY);
  10. BOOL NotifySCM(DWORD, DWORD, DWORD);
  11. VOID WINAPI ServiceMain(DWORD, LPTSTR *);
  12. VOID WINAPI ServiceHandler(DWORD);
  13. DWORD WINAPI WorkerThread(LPVOID);
  14.  
  15.  
  16. //-----------------------------------------------------------------
  17. void main(void)
  18. {
  19.     DWORD ThreadId;
  20.     SERVICE_TABLE_ENTRY ServiceTable[] = {
  21.         {TEXT("WDJSrvc"), ServiceMain}, {NULL, NULL}
  22.     };
  23.  
  24.     if (!StartedAsService(ServiceTable)) {
  25.         // Didn't start as a service, run as a normal process
  26.         hThread = CreateThread(0,0,WorkerThread,0,0,&ThreadId);
  27.         if (hThread != NULL) {
  28.             WaitForSingleObject(hThread, INFINITE);
  29.         }
  30.     }
  31. }
  32.  
  33. //-----------------------------------------------------------------
  34. VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
  35. {
  36.    DWORD   ThreadId;
  37.  
  38.    if (!(hService = RegisterServiceCtrlHandler(
  39.                         TEXT("WDJSrvc"), ServiceHandler)))
  40.       return;
  41.  
  42.    NotifySCM(SERVICE_START_PENDING, 0, 1);
  43.  
  44.    if (!(hDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL)))
  45.       return;
  46.  
  47.    if (!(hThread = CreateThread(0,0,WorkerThread,0,0,&ThreadId))) {
  48.       CloseHandle(hDoneEvent);
  49.       return;
  50.    }
  51.  
  52.    NotifySCM(SERVICE_RUNNING, 0, 0);
  53.    WaitForSingleObject(hDoneEvent, INFINITE);
  54.  
  55.    CloseHandle(hThread);
  56.    CloseHandle(hDoneEvent);
  57.    return;
  58. }
  59.  
  60. //-----------------------------------------------------------------
  61. VOID WINAPI ServiceHandler(DWORD fdwControl)
  62. {
  63.     // this service doesn't support pause-continue
  64.     switch(fdwControl) {
  65.         case SERVICE_CONTROL_STOP:
  66.             NotifySCM(SERVICE_STOP_PENDING, 0, 1);
  67.             SetEvent(hDoneEvent);
  68.             NotifySCM(SERVICE_STOPPED, 0, 0);
  69.             break;
  70.  
  71.         case SERVICE_CONTROL_INTERROGATE:
  72.             NotifySCM(dwCurrentState, 0, 0);
  73.             break;
  74.  
  75.         default:
  76.             break;
  77.     }
  78. }
  79.  
  80. //-----------------------------------------------------------------
  81. BOOL NotifySCM(DWORD State, DWORD ExitCode, DWORD Progress)
  82. {
  83.    SERVICE_STATUS ServiceStatus;
  84.  
  85.    ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
  86.    ServiceStatus.dwCurrentState = dwCurrentState = State;
  87.    ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
  88.    ServiceStatus.dwWin32ExitCode = ExitCode;
  89.    ServiceStatus.dwServiceSpecificExitCode = 0;
  90.    ServiceStatus.dwCheckPoint = Progress;
  91.    ServiceStatus.dwWaitHint = 5000;
  92.  
  93.    return SetServiceStatus(hService, &ServiceStatus);
  94. }
  95.  
  96. //-----------------------------------------------------------------
  97. DWORD WINAPI WorkerThread(LPVOID ThreadParam)
  98. {
  99.    while (TRUE) {
  100.       Sleep(10000);
  101.       MessageBeep(0);
  102.    }
  103.    return TRUE;
  104. }
  105.  
  106.